package com.linwen.javase.new8.methodreference;

import com.linwen.javase.new8.stream.StreamObj;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class MethodReferenceTest {
    ArrayList<StreamObj> list = new ArrayList<>();
    /**
     * 方法引用格式
     * 类名::静态方法名    代码只有一行，调用了某个类的静态方法，重写的方法参数全部传入了这个静态方法中。
     * 对象名::方法名      代码只有一行，调用了某个类的成员方法，重写方法的参数全部传入了这个成员方法中。
     * 类名::方法名       代码只有一行，调用了第一个参数的成员方法，重写方法的参数全部传入了这个成员方法中。
     * 构造器引用         代码只有一行，调用了某个类的构造方法，重写方法的参数全部传入了这个类的构造方法中。
     * */
    @Test
    public void test(){
        System.out.println("类名::静态方法名");
        list.stream()
                .map(String::valueOf)// 类名::静态方法名    代码只有一行，调用了某个类的静态方法，重写的方法参数全部传入了这个静态方法中。
                .forEach(System.out::println);

        System.out.println("对象名::方法名");
        StringBuilder sb = new StringBuilder();
        list.stream()
                .map(item->item.getName())
                .forEach(sb::append);// 对象名::方法名      代码只有一行，调用了某个类的成员方法，重写方法的参数全部传入了这个成员方法中。

        System.out.println("类名::方法名");
        list.stream()
                .map(StreamObj::getAddress)// 类名::方法名        代码只有一行，调用了第一个参数的成员方法，重写方法的参数全部传入了这个成员方法中。
                .forEach(System.out::println);

        System.out.println("构造器引用");
        List<StringBuilder> collect = list.stream()
                .map(StreamObj::getAddress)
                .map(StringBuilder::new)// 构造器引用         代码只有一行，调用了某个类的构造方法，重写方法的参数全部传入了这个类的构造方法中。
                .collect(Collectors.toList());
        System.out.println(collect);


    }

    @Before
    public void before(){
        list.add(new StreamObj("张三", 13, "深圳"));
        list.add(new StreamObj("李四",15,"上海"));
        list.add(new StreamObj("王武",14,"北京,上海"));
        list.add(new StreamObj("赵六",16,"武威,南京"));
        list.add(new StreamObj("赵六",16,"武威,南宁"));
    }

}
